home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
utils
/
satpic
/
satpic.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-03
|
14KB
|
703 lines
;
; HUOM!
;
; SatPic-ohjelma on alun perin tehty assembler-kielen esiprosessoria käyttäen.
; Alkuperäinen lähdekoodi on tiedostossa SatPic.alp, tämän tiedoston sisältämä
; listaus on esiprosessorin tuottamaa ja siksi symbolien arvot ovat koneelli-
; sesti tuotettuja. Tämä tiedosto on käännettävissä A68k-kääntäjällä,
; SatPic.alp vaatii kääntyäkseen esiprosessoinnin.
;
; Kommentteja ei valitettavasti ole liiemmälti viljelty...
;
;
PREPROC set 1
;+asm
;add lkopt SC
;do
;*
;
; ### WeatherSatelliteReceiver by JM v 1.00 ###
;
; - Created 910523 by JM -
;
;
; Usage:
; sat [buf_siz]
;
; where buf_siz is the raw buffer size (default 16384).
;
;
; Bugs: Hmm. If you ask me, the hardware itself is a big bug.
;
;
; Edited:
;
; - 910523 by JM -> v0.01 - code from uBDitigizer. | One year since.. |
; - 910524 by JM -> v0.02 - Opens a screen and a window.
; - 910525..910529 - Lots of modifications, it works now.
; - 910530 by JM -> v1.00 - All commands finished, code crunched and tested.
; - Uses a command table instead of several cmp.b's.
;
include "bb.i"
include "exec/types.i"
include "exec/execbase.i"
include "exec/tasks.i"
include "exec/nodes.i"
include "exec/memory.i"
include "exec/io.i"
include "exec/strings.i"
include "exec/interrupts.i"
include "exec/initializers.i"
include "hardware/intbits.i"
include "hardware/cia.i"
include "exec/interrupts.i"
include "intuition/intuition.i"
include "com.i"
include "relative.i"
include "util.i"
include "macros.i"
; include "constants.i"
include "hards.i"
XREF _LVOSetICR
XREF _LVOAbleICR
XREF _LVOAddICRVector
XREF _LVORemICRVector
_LVOAllocMiscResource equ -6
_LVOFreeMiscResource equ -12
MR_PARALLELPORT equ 2
userport equ $bfe101
datadir equ $bfe301
timerl equ $bfd400
timerh equ $bfd500
tcontrol equ $bfde00
tint equ $bfdd00
HUGEMEM equ 1000000000 -- never to be available --
ROWS equ 512
BYTESPERROW equ 40
.GfxBase equ -4
xdef .GfxBase
.IntuitionBase equ -8
xdef .IntuitionBase
.MiscResBase equ -12
xdef .MiscResBase
.CIABase equ -16
xdef .CIABase
DATA equ -20
data equ -24
screen equ -28
window equ -32
begbuf equ -36
bufpoi equ -40
modulo equ -44
parport equ -45
int equ -46
link a4,#-46
movem.l d0/a4,-(sp)
moveq #10,d0
._1 clr.l -(a4)
dbf d0,._1
clr.w -(a4)
movem.l (sp)+,d0/a4
moveq #0,d2 ; result
_1.numlp moveq #0,d0
move.b (a0)+,d0
sub.b #'0',d0
blo.s _1.numgot
cmp.b #'9',d0
bhi.s _1.numgot
add.l d2,d2 ; d2 = old * 2
move.l d2,d1 ; d1 = old * 2
add.l d2,d2 ; d2 = old * 4
add.l d2,d2 ; d2 = old * 8
add.l d1,d2 ; d2 = old * 10
add.l d0,d2 ; d2 = old * 10 + new
bra.s _1.numlp
_1.numgot
xref _LVOOldOpenLibrary
lea ._2(pc),a1
move.l $4,a6
jsr _LVOOldOpenLibrary(a6)
move.l d0,.GfxBase(a4)
beq _1.cleanup
lea ._3(pc),a1
move.l $4,a6
jsr _LVOOldOpenLibrary(a6)
move.l d0,.IntuitionBase(a4)
beq _1.cleanup
move.l #16384,d0
cmp.l d0,d2
blo.s _1.numerr ; not a valid buffer size
move.l d2,d0
_1.numerr move.l d0,DATA(a4) ; save buffer size
moveq #103,d7 ; out of memory
move.l #MEMF_PUBLIC,d1
xref _LVOAllocMem
move.l $4,a6
jsr _LVOAllocMem(a6)
move.l d0,data(a4)
beq _1.cleanup
move.l d0,a0
move.l a0,begbuf(a4)
move.l DATA(a4),a2
subq.l #4,a2
add.l a0,a2 ; end address
moveq #0,d5 ; start from color #0
patloop0 moveq #15,d4
patloop1 moveq #19,d3
move.l d5,d0 ; color
patloop2 moveq #15,d2
patloop3 move.b d0,(a0)+ ; put 16 bytes of the same color
cmp.l a2,a0
bhs pattern_ok
dbf d2,patloop3
add.w #16,d0 ; change color
dbf d3,patloop2
dbf d4,patloop1
add.w #16,d5
bra patloop0
pattern_ok move.w #202,d7 ; cant get parallel port
bsr allocparallel
bne _1.cleanup
moveq #0,d0
lea nscreen(pc),a1
lea NS,a2
xref _LVOInitStruct
move.l $4,a6
jsr _LVOInitStruct(a6)
moveq #104,d7 ; cannot OpenScreen()
move.l a2,a0
xref _LVOOpenScreen
move.l .IntuitionBase(a4),a6
jsr _LVOOpenScreen(a6)
move.l d0,screen(a4)
beq _1.cleanup
move.l d0,a2
lea sc_ViewPort(a2),a0
lea colors(pc),a1
moveq #16,d0
xref _LVOLoadRGB4
move.l .GfxBase(a4),a6
jsr _LVOLoadRGB4(a6)
moveq #106,d7 ; cannot OpenWindow()
moveq #0,d0
lea nwindow(pc),a1
lea NW,a2
move.l $4,a6
jsr _LVOInitStruct(a6)
move.l a2,a0
move.l screen(a4),nw_Screen(a0)
xref _LVOOpenWindow
move.l .IntuitionBase(a4),a6
jsr _LVOOpenWindow(a6)
move.l d0,window(a4)
beq _1.cleanup
move.l #(BYTESPERROW*8*256),modulo(a4)
moveq #127,d7
bsr allocint
bne _1.cleanup
_1.waitloop bsr geti
bmi _1.away
beq _1.waitloop
tst.b d0
bmi _1.waitloop ; key UP
_1.handle lea _1.cmdtable(pc),a2 ; RAW.B, QUAL.B, ADR.W
_1.handlecmp move.b (a2)+,d2 ; get rawkey code
beq.s _1.waitloop ; not found
cmp.b d2,d0 ; entry = key pressed?
beq.s _1.handlefnd ; yep -> check qualifier
addq.l #3,a2 ; nope -> next entry
bra.s _1.handlecmp
_1.handlefnd move.b (a2)+,d2 ; get qualifier from table
beq.s _1.handledoit ; zero -> don't care, do it
and.b d1,d2 ; non-zero: perform and
bne.s _1.handledoit ; yep, go do it
addq.l #2,a2 ; nope, try next one
bra.s _1.handlecmp
_1.handledoit moveq #0,d2 ; clear d2
add.w (a2),a2 ; get jump address
jmp (a2)
_1.cmdtable dc.b $45,0 ; ESC
dptr _1.away
dc.b $22,0 ; D
dptr _1.Cdigi
dc.b $4f,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift left
dptr _1.CSleft
dc.b $4e,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift right
dptr _1.CSright
dc.b $2d,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift num4
dptr _1.CSnum4
dc.b $2f,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift num 6
dptr _1.CSnum6
dc.b $2e,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift num 5
dptr _1.CSnum5
dc.b $2d,IEQUALIFIER_LALT!IEQUALIFIER_RALT ; alt num 4
dptr _1.CAnum4
dc.b $2f,IEQUALIFIER_LALT!IEQUALIFIER_RALT ; alt num 6
dptr _1.CAnum6
dc.b $4c,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift up
dptr _1.CSup
dc.b $4d,IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT ; shift down
dptr _1.CSdown
dc.b $4c,IEQUALIFIER_LALT!IEQUALIFIER_RALT ; alt up
dptr _1.Creset
dc.b $4d,IEQUALIFIER_LALT!IEQUALIFIER_RALT ; alt down
dptr _1.Creset
dc.b $4c,0 ; cursor up
dptr _1.Cup
dc.b $4d,0 ; cursor down
dptr _1.Cdown
dc.b $4f,0 ; cursor left
dptr _1.Cleft
dc.b $4e,0 ; cursor right
dptr _1.Cright
dc.b $2d,0 ; numeric pad 4
dptr _1.Cnum4
dc.b $2f,0 ; numeric pad 6
dptr _1.Cnum6
dc.b $2e,0 ; numeric pad 5
dptr _1.Cnum5
dc.b $40,0 ; space
dptr _1.Cspace
dc.w 0
_1.CSright moveq #31,d2 ; step = 32 pixels
_1.Cright addq.l #1,d2 ; step = 1 pixel
bra.s _1.startadr
_1.CSleft moveq #-31,d2 ; step = -32 pixels
_1.Cleft subq.l #1,d2 ; step = -1 pixel
_1.startadr move.l begbuf(a4),d1
add.l d2,d1
cmp.l data(a4),d1
bhs.s _1.starta_ok
move.l data(a4),d1 ; set to data if too low
_1.starta_ok move.l d1,begbuf(a4)
_1.Cspace bsr convert
bmi _1.away
beq _1.waitloop
bra _1.handle
_1.CSup move.w #-9920,d2 ; step = -10240 pixels
_1.Cup sub.w #320,d2 ; step = -320 pixels
ext.l d2
bra.s _1.startadr
_1.CSdown move.w #9920,d2 ; step = -10240 pixels
_1.Cdown add.w #320,d2 ; step = 320 pixels
bra.s _1.startadr
_1.Cnum4 moveq #-64,d2
bra.s _1.modulo
_1.Cnum6 moveq #64,d2
_1.modulo move.l modulo(a4),d1
add.l d2,d1
bpl _1.modulo_ok
moveq #0,d1 ; set to 0 if too low
_1.modulo_ok move.l d1,modulo(a4)
bra _1.Cspace
_1.CSnum4 move.w #-768,d2
ext.l d2
bra.s _1.modulo
_1.CSnum6 move.w #768,d2
bra.s _1.modulo
_1.CAnum4 moveq #-1,d2
bra.s _1.modulo
_1.CAnum6 moveq #1,d2
bra.s _1.modulo
_1.Creset move.l data(a4),begbuf(a4)
_1.Cnum5 move.l #(BYTESPERROW*8*256),modulo(a4)
bra _1.Cspace
_1.CSnum5 move.l #(BYTESPERROW*16*256),modulo(a4)
bra _1.Cspace
_1.Cdigi bsr geti
bmi.s _1.away
cmp.b #($22!$80),d0
bne.s _1.Cdigi
bsr digitize
bra _1.Cspace
_1.away moveq #0,d7
_1.cleanup bsr freeint
move.l data(a4),d0
beq.s ._4
move.l d0,a1
move.l DATA(a4),d0
xref _LVOFreeMem
move.l $4,a6
jsr _LVOFreeMem(a6)
._4
move.l window(a4),d0
beq.s ._5
move.l d0,a0
xref _LVOCloseWindow
move.l .IntuitionBase(a4),a6
jsr _LVOCloseWindow(a6)
._5
move.l screen(a4),d0
beq.s ._6
move.l d0,a0
xref _LVOCloseScreen
move.l .IntuitionBase(a4),a6
jsr _LVOCloseScreen(a6)
._6
bsr freeparallel
xref _LVOCloseLibrary
move.l .IntuitionBase(a4),d0
beq.s ._7
move.l d0,a1
move.l $4,a6
jsr _LVOCloseLibrary(a6)
clr.l .IntuitionBase(a4)
._7
move.l .GfxBase(a4),d0
beq.s ._8
move.l d0,a1
move.l $4,a6
jsr _LVOCloseLibrary(a6)
clr.l .GfxBase(a4)
._8
move.l d7,d0
unlk a4
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
geti
movem.l d2-d3/a0-a2,-(sp)
move.l window(a4),a0
move.l wd_UserPort(a0),a2
move.b MP_SIGBIT(a2),d2
moveq #0,d0
bset d2,d0
bset #12,d0
xref _LVOWait
move.l $4,a6
jsr _LVOWait(a6)
btst d2,d0
beq _2.ctrlc
move.l window(a4),a0
move.l wd_UserPort(a0),a2
move.l a2,a0
xref _LVOGetMsg
jsr _LVOGetMsg(a6)
tst.l d0
beq.s _2.nutton
move.l d0,a1
moveq #0,d2
moveq #0,d3
cmp.l #RAWKEY,im_Class(a1)
bne.s _2.reply
move.w im_Code(a1),d2
move.w im_Qualifier(a1),d3
_2.reply
xref _LVOReplyMsg
jsr _LVOReplyMsg(a6)
_2.eat move.l a2,a0 ; eat extra messages
jsr _LVOGetMsg(a6)
tst.l d0
beq.s ._9
move.l d0,a1
jsr _LVOReplyMsg(a6)
bra _2.eat
._9
move.l d3,d1 ; return Qualifier
move.l d2,d0 ; return a rawkey
bra.s _2.out
_2.ctrlc moveq #-1,d0
bra.s _2.out
_2.nutton moveq #0,d0
_2.out
movem.l (sp)+,d2-d3/a0-a2
rts
allocparallel
move.l #HUGEMEM,d0
move.l d0,d2
moveq #MEMF_PUBLIC,d1
move.l $4,a6
jsr _LVOAllocMem(a6)
tst.l d0
beq.s _3.notgot
move.l d0,a1
move.l d2,d0
jsr _LVOFreeMem(a6)
_3.notgot
lea ._A(pc),a1
moveq.l #0,d0
xref _LVOOpenResource
jsr _LVOOpenResource(a6)
move.l d0,.MiscResBase(a4)
beq _3.error
moveq.l #MR_PARALLELPORT,d0
lea prgname(pc),a1
move.l .MiscResBase(a4),a6
jsr _LVOAllocMiscResource(a6)
tst.l d0
bne.s _3.error
st parport(a4)
move.b d0,datadir
rts .ne
_3.error moveq #1,d0
rts
freeparallel
tst.b parport(a4)
beq.s ._B
moveq #MR_PARALLELPORT,d0
move.l .MiscResBase(a4),a6
jsr _LVOFreeMiscResource(a6)
._B
rts
allocint
lea ._C(pc),a1
move.l $4,a6
jsr _LVOOpenResource(a6)
move.l d0,.CIABase(a4)
xref _LVODisable
move.l $4,a6
jsr _LVODisable(a6)
lea interr,a1
move.b #NT_INTERRUPT,LN_TYPE(a1)
lea prgname(pc),a0
move.l a0,LN_NAME(a1)
lea irqcode(pc),a0
move.l a0,IS_CODE(a1) ; addr of irq routine
moveq #CIAICRB_TA,d0 ; we want timer A
xref _LVOAddICRVector
move.l .CIABase(a4),a6
jsr _LVOAddICRVector(a6)
move.l d0,d2
bne _5.error
moveq #1,d0
xref _LVOAbleICR ; disable interrupt
jsr _LVOAbleICR(a6)
moveq #1,d0
xref _LVOSetICR ; clear interrupt
jsr _LVOSetICR(a6)
xref _LVOEnable
move.l $4,a6
jsr _LVOEnable(a6)
st int(a4)
moveq #0,d0
rts
_5.error
move.l $4,a6
jsr _LVOEnable(a6)
moveq #-1,d0 ; error
rts
freeint
tst.b int(a4)
beq.s ._D
moveq #CIAICRB_TA,d0
lea interr,a1
xref _LVORemICRVector
move.l .CIABase(a4),a6
jsr _LVORemICRVector(a6)
._D
irqcode rts ; kludge, int doesn't do anything
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
digitize
move.l $4,a6 ; 709379 kHz
jsr _LVODisable(a6)
move.b #68,timerl ; /8samples/320pixels/4Hz
move.b #0,timerh
or.b #$01,tcontrol ; start timer A
lea userport,a0 ; source
move.l data(a4),a1 ; destination
move.l a1,begbuf(a4)
move.l #(BYTESPERROW*8*256),modulo(a4)
lea tint,a2
move.l DATA(a4),d2 ; # of bytes
move.w #$80,d1
_7.dloop moveq #7,d3 ; sample #
moveq #0,d7 ; clear sum
btst #0,(a2)
beq.s _7.dwait
move.w #$f00,$dff180
bra.s _7.dbusy
_7.dwait btst #0,(a2)
beq.s _7.dwait
_7.dbusy moveq #0,d0
move.b (a0),d0
sub.w d1,d0 ; sub mid level
bpl.s _7.dwok ; positive?
neg.w d0 ; no, make it
_7.dwok add.w d0,d7 ; sum
dbf d3,_7.dwait ; do for 8 samples
lsr.w #2,d7 ; shift sum
move.b d7,(a1)+ ; save sample
subq.l #1,d2
bne.s _7.dloop
jsr _LVOEnable(a6)
rts
convert
clr.l bufpoi(a4)
move.l window(a4),a0
move.l wd_UserPort(a0),a0
move.b MP_SIGBIT(a0),d7 ; sigbit
move.l $4,a6
move.l screen(a4),a2
lea sc_RastPort(a2),a2 ; rp
move.l rp_BitMap(a2),a2 ; bitmap
lea.l bm_Planes(a2),a5 ; planeptrs
movem.l (a5),a0-a3 ; get plane pointrs
move.l begbuf(a4),a5 ; source dataptr
move.w #ROWS-1,d6 ; rows per plane
_8.rowloop swap d6
move.w #(BYTESPERROW/2-1),d6 ; words to write per row
_8.byteloop moveq #15,d5 ; bit counter
_8.bitloop move.b (a5)+,d4 ; data byte
roxr.b #5,d4
roxl.w #1,d0 ; plane 0
roxr.b #1,d4
roxl.w #1,d1 ; plane 1
roxr.b #1,d4
roxl.w #1,d2 ; plane 2
roxr.b #1,d4
roxl.w #1,d3 ; plane 3
dbf d5,_8.bitloop
move.w d0,(a0)+
move.w d1,(a1)+
move.w d2,(a2)+
move.w d3,(a3)+
dbf d6,_8.byteloop
moveq #0,d0
moveq #0,d1
movem.l a0-a1,-(sp)
xref _LVOSetSignal ; user activity?
jsr _LVOSetSignal(a6)
movem.l (sp)+,a0-a1
btst d7,d0
beq.s _8.go_on
bsr geti
bmi.s _8.away
tst.b d0
bpl.s _8.away ; got a new rawkey
_8.go_on move.l begbuf(a4),a5 ; restore buffer start address
move.l modulo(a4),d0
move.l bufpoi(a4),d1
add.l d0,d1
move.l d1,bufpoi(a4)
asr.l #8,d1
add.l d1,a5
swap d6
dbf d6,_8.rowloop
moveq #0,d0
_8.away
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
iniword MACRO *
DC.B $90
DC.B \1
DC.W \2
ENDM
inilong MACRO *
DC.B $80
DC.B \1
DC.L \2
ENDM
nscreen iniword ns_Width,BYTESPERROW*8
iniword ns_Height,ROWS
iniword ns_Depth,4
iniword ns_DetailPen,-1
iniword ns_ViewModes,V_SPRITES!V_LACE
iniword ns_Type,CUSTOMSCREEN!SCREENQUIET
dc.w 0
nwindow iniword nw_Width,BYTESPERROW*8
iniword nw_Height,ROWS
iniword nw_DetailPen,-1
inilong nw_IDCMPFlags,RAWKEY
inilong nw_Flags,ACTIVATE!BORDERLESS!BACKDROP
iniword nw_Type,CUSTOMSCREEN
dc.w 0
colors dc.w $0000,$0111,$0222,$0333,$0444,$0555,$0666,$0777
dc.w $0888,$0999,$0aaa,$0bbb,$0ccc,$0ddd,$0eee,$0fff
prgname dc.b 'sat',0
.GfxName set *
._2 dc.b 'graphics.library',0
.IntuitionName set *
._3 dc.b 'intuition.library',0
._A dc.b 'misc.resource'
dc.b 0
._C dc.b 'ciab.resource'
dc.b 0
ds.w 0
section hyi,bss
NS ds.b ns_SIZEOF
NW ds.b nw_SIZE
interr ds.b IS_SIZE
end